Setup

Ensure that the development version of DiagrammeR is installed. Load in the package with library().

#devtools::install_github("rich-iannone/DiagrammeR")
library(DiagrammeR)

Part 1. Information on All Nodes and Edges

When you have a graph object, sometimes you’ll want to poke around and inspect some of the nodes, and some of the edges. There are very good reasons for doing so. There can be valuable information within the nodes and edges. Further graph construction may hinge on what’s extant in the graph. Inspection is a good way to verify that graph modification has indeed taken place in the correct manner.

First, let’s build a graph to use for the examples. For the node data frame we will include values for the type, label, and data attributes. The edge data frame will contain the rel, color, and weight edge attributes.

# Create a node data frame (ndf) with
# 4 nodes
ndf <-
  create_node_df(
    n = 4,
    type = "number",
    label = c("one", "two",
              "three", "four"),
    data = c(3.5, 2.6, 9.4, 2.7))
# Create an edge data frame (ndf) with
# 4 edges
edf <-
  create_edge_df(
    from = c(1, 2, 3, 4),
    to = c(4, 3, 1, 1),
    rel = c("P", "B", "L", "L"),
    color = c("green", "blue", "red", "red"),
    weight = c(2.1, 5.7, 10.1, 3.9))
graph <-
  create_graph(
    nodes_df = ndf,
    edges_df = edf)
# Render the graph to see it in the RStudio Viewer
render_graph(graph)

The get_node_ids() function simply returns a vector of node ID values. This is useful in many cases and is great when used as a sanity check.

get_node_ids(graph)
[1] 1 2 3 4

Using the node_info() function provides a data frame with detailed information on nodes and their interrelationships within a graph. It always returns the same columns, in the same order. It returns as many rows as there are nodes in the graph. It’s useful when you want a quick summary of the node ID values, their labels and type values, and their degree of connectedness with other nodes.

node_info(graph)

In the above table the base attributes of the nodes are provided first (id, type, and label) and then follow the columns with degree information (deg, indeg, and outdeg). The node degree (deg) describes the number of edges to or from the node. The indegree and outdegree are the number of edges coming in to the node and out from the node, respectively. Finally, the loops column provides the number of self edges for the node (this is an edge that starts and terminates at the same node, so the degree for that is 2).

The get_edges() function returns all of the node ID values related to each edge in the graph:

get_edges(graph)
[1] "1->4" "2->3" "3->1" "4->1"

Like nodes, edges also have ID values. This is important for distinguishing between edges when a pair of nodes has multiple edges between them (and especially if they are in the same direction in a directed graph). To get all edge ID values in the graph, use the get_edge_ids() function.

get_edge_ids(graph)
[1] 1 2 3 4

The edge_info(), like the node_info() function, always returns a data frame with a set number of columns. In this case, it is the edge ID value id, the node ID values from and to that define the links, and the relationship (rel) labels for the edges.

edge_info(graph)

Part 2. Inspecting Nodes, Edges, and their Attributes

Two of a graph object’s main components are its node data frame (ndf) and its edge data frame (edf). These can be obtained as individual data frames using the get_node_df() and get_edge_df() functions:

# Get the graph's ndf with the `get_node_df()` function
get_node_df(graph)
# Get the graph's edf with the `get_edge_df()` function
get_edge_df(graph)

For the ndf, the id, type, and label columns will always be present and in that prescribed order. For the edf, it is the id, from, to, and rel columns will always be present. Any additional columns can be either parameters recognized by the graph rendering engine (e.g., color, fontname, etc.) or non-aesthetic properties of the nodes or edges (e.g., a node data value or an edge weight).

Part 3. Determining Existence of Nodes or Edges

There may be cases where you need to verify that a certain node ID exists in the graph or that an edge definition is present. The node_present() and edge_present() functions will provide a TRUE or FALSE value as confirmation.

Get the node ID values present in the graph with the get_node_ids() function.

get_node_ids(graph)
[1] 1 2 3 4

Is node with ID 1 in the graph? Use node_present() to find out.

node_present(graph, 1)
[1] TRUE

Is node with ID 5 in the graph?

node_present(graph, 5)
[1] FALSE

Get the node ID values associated with the edges present in the graph (with the get_edges() function).

get_edges(graph)
[1] "1->4" "2->3" "3->1" "4->1"

To determine whether an edge is present, the edge_present() function takes 2 arguments after graph: from and to. So, to find out whether the edge 1->4 is present, the following can be used:

edge_present(graph, 1, 4)
[1] TRUE

Since the the edge 2->4 does not exist, the following will return FALSE:

edge_present(graph, 2, 4)
[1] FALSE
LS0tDQp0aXRsZTogIjAwNSAtIEluc3BlY3RpbmcgTm9kZXMgYW5kIEVkZ2VzIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KIyMgU2V0dXANCg0KRW5zdXJlIHRoYXQgdGhlIGRldmVsb3BtZW50IHZlcnNpb24gb2YgKipEaWFncmFtbWVSKiogaXMgaW5zdGFsbGVkLiBMb2FkIGluIHRoZSBwYWNrYWdlIHdpdGggYGxpYnJhcnkoKWAuDQoNCmBgYHtyIGxvYWRfcGFja2FnZXMsIHJlc3VsdHM9RkFMU0V9DQojZGV2dG9vbHM6Omluc3RhbGxfZ2l0aHViKCJyaWNoLWlhbm5vbmUvRGlhZ3JhbW1lUiIpDQoNCmxpYnJhcnkoRGlhZ3JhbW1lUikNCmBgYA0KDQojIyBQYXJ0IDEuIEluZm9ybWF0aW9uIG9uIEFsbCBOb2RlcyBhbmQgRWRnZXMNCg0KV2hlbiB5b3UgaGF2ZSBhIGdyYXBoIG9iamVjdCwgc29tZXRpbWVzIHlvdSdsbCB3YW50IHRvIHBva2UgYXJvdW5kIGFuZCBpbnNwZWN0IHNvbWUgb2YgdGhlIG5vZGVzLCBhbmQgc29tZSBvZiB0aGUgZWRnZXMuIFRoZXJlIGFyZSB2ZXJ5IGdvb2QgcmVhc29ucyBmb3IgZG9pbmcgc28uIFRoZXJlIGNhbiBiZSB2YWx1YWJsZSBpbmZvcm1hdGlvbiB3aXRoaW4gdGhlIG5vZGVzIGFuZCBlZGdlcy4gRnVydGhlciBncmFwaCBjb25zdHJ1Y3Rpb24gbWF5IGhpbmdlIG9uIHdoYXQncyBleHRhbnQgaW4gdGhlIGdyYXBoLiBJbnNwZWN0aW9uIGlzIGEgZ29vZCB3YXkgdG8gdmVyaWZ5IHRoYXQgZ3JhcGggbW9kaWZpY2F0aW9uIGhhcyBpbmRlZWQgdGFrZW4gcGxhY2UgaW4gdGhlIGNvcnJlY3QgbWFubmVyLg0KDQpGaXJzdCwgbGV0J3MgYnVpbGQgYSBncmFwaCB0byB1c2UgZm9yIHRoZSBleGFtcGxlcy4gRm9yIHRoZSBub2RlIGRhdGEgZnJhbWUgd2Ugd2lsbCBpbmNsdWRlIHZhbHVlcyBmb3IgdGhlIGB0eXBlYCwgYGxhYmVsYCwgYW5kIGBkYXRhYCBhdHRyaWJ1dGVzLiBUaGUgZWRnZSBkYXRhIGZyYW1lIHdpbGwgY29udGFpbiB0aGUgYHJlbGAsIGBjb2xvcmAsIGFuZCBgd2VpZ2h0YCBlZGdlIGF0dHJpYnV0ZXMuDQoNCmBgYHtyIGNyZWF0ZV9pbml0aWFsX2dyYXBofQ0KIyBDcmVhdGUgYSBub2RlIGRhdGEgZnJhbWUgKG5kZikgd2l0aA0KIyA0IG5vZGVzDQpuZGYgPC0NCiAgY3JlYXRlX25vZGVfZGYoDQogICAgbiA9IDQsDQogICAgdHlwZSA9ICJudW1iZXIiLA0KICAgIGxhYmVsID0gYygib25lIiwgInR3byIsDQogICAgICAgICAgICAgICJ0aHJlZSIsICJmb3VyIiksDQogICAgZGF0YSA9IGMoMy41LCAyLjYsIDkuNCwgMi43KSkNCg0KIyBDcmVhdGUgYW4gZWRnZSBkYXRhIGZyYW1lIChuZGYpIHdpdGgNCiMgNCBlZGdlcw0KZWRmIDwtDQogIGNyZWF0ZV9lZGdlX2RmKA0KICAgIGZyb20gPSBjKDEsIDIsIDMsIDQpLA0KICAgIHRvID0gYyg0LCAzLCAxLCAxKSwNCiAgICByZWwgPSBjKCJQIiwgIkIiLCAiTCIsICJMIiksDQogICAgY29sb3IgPSBjKCJncmVlbiIsICJibHVlIiwgInJlZCIsICJyZWQiKSwNCiAgICB3ZWlnaHQgPSBjKDIuMSwgNS43LCAxMC4xLCAzLjkpKQ0KDQpncmFwaCA8LQ0KICBjcmVhdGVfZ3JhcGgoDQogICAgbm9kZXNfZGYgPSBuZGYsDQogICAgZWRnZXNfZGYgPSBlZGYpDQoNCiMgUmVuZGVyIHRoZSBncmFwaCB0byBzZWUgaXQgaW4gdGhlIFJTdHVkaW8gVmlld2VyDQpyZW5kZXJfZ3JhcGgoZ3JhcGgpDQpgYGANCg0KVGhlIGBnZXRfbm9kZV9pZHMoKWAgZnVuY3Rpb24gc2ltcGx5IHJldHVybnMgYSB2ZWN0b3Igb2Ygbm9kZSBJRCB2YWx1ZXMuIFRoaXMgaXMgdXNlZnVsIGluIG1hbnkgY2FzZXMgYW5kIGlzIGdyZWF0IHdoZW4gdXNlZCBhcyBhIHNhbml0eSBjaGVjay4NCg0KYGBge3IgdXNlX2dldF9ub2RlX2lkc30NCmdldF9ub2RlX2lkcyhncmFwaCkNCmBgYA0KDQpVc2luZyB0aGUgYG5vZGVfaW5mbygpYCBmdW5jdGlvbiBwcm92aWRlcyBhIGRhdGEgZnJhbWUgd2l0aCBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiBub2RlcyBhbmQgdGhlaXIgaW50ZXJyZWxhdGlvbnNoaXBzIHdpdGhpbiBhIGdyYXBoLiBJdCBhbHdheXMgcmV0dXJucyB0aGUgc2FtZSBjb2x1bW5zLCBpbiB0aGUgc2FtZSBvcmRlci4gSXQgcmV0dXJucyBhcyBtYW55IHJvd3MgYXMgdGhlcmUgYXJlIG5vZGVzIGluIHRoZSBncmFwaC4gSXQncyB1c2VmdWwgd2hlbiB5b3Ugd2FudCBhIHF1aWNrIHN1bW1hcnkgb2YgdGhlIG5vZGUgSUQgdmFsdWVzLCB0aGVpciBsYWJlbHMgYW5kIGB0eXBlYCB2YWx1ZXMsIGFuZCB0aGVpciBkZWdyZWUgb2YgY29ubmVjdGVkbmVzcyB3aXRoIG90aGVyIG5vZGVzLg0KDQpgYGB7ciB1c2Vfbm9kZV9pbmZvfQ0Kbm9kZV9pbmZvKGdyYXBoKQ0KYGBgDQoNCkluIHRoZSBhYm92ZSB0YWJsZSB0aGUgYmFzZSBhdHRyaWJ1dGVzIG9mIHRoZSBub2RlcyBhcmUgcHJvdmlkZWQgZmlyc3QgKGBpZGAsIGB0eXBlYCwgYW5kIGBsYWJlbGApIGFuZCB0aGVuIGZvbGxvdyB0aGUgY29sdW1ucyB3aXRoIGRlZ3JlZSBpbmZvcm1hdGlvbiAoYGRlZ2AsIGBpbmRlZ2AsIGFuZCBgb3V0ZGVnYCkuIFRoZSBub2RlIGRlZ3JlZSAoYGRlZ2ApIGRlc2NyaWJlcyB0aGUgbnVtYmVyIG9mIGVkZ2VzIHRvIG9yIGZyb20gdGhlIG5vZGUuIFRoZSBpbmRlZ3JlZSBhbmQgb3V0ZGVncmVlIGFyZSB0aGUgbnVtYmVyIG9mIGVkZ2VzIGNvbWluZyBpbiB0byB0aGUgbm9kZSBhbmQgb3V0IGZyb20gdGhlIG5vZGUsIHJlc3BlY3RpdmVseS4gRmluYWxseSwgdGhlIGBsb29wc2AgY29sdW1uIHByb3ZpZGVzIHRoZSBudW1iZXIgb2Ygc2VsZiBlZGdlcyBmb3IgdGhlIG5vZGUgKHRoaXMgaXMgYW4gZWRnZSB0aGF0IHN0YXJ0cyBhbmQgdGVybWluYXRlcyBhdCB0aGUgc2FtZSBub2RlLCBzbyB0aGUgZGVncmVlIGZvciB0aGF0IGlzIDIpLg0KDQpUaGUgYGdldF9lZGdlcygpYCBmdW5jdGlvbiByZXR1cm5zIGFsbCBvZiB0aGUgbm9kZSBJRCB2YWx1ZXMgcmVsYXRlZCB0byBlYWNoIGVkZ2UgaW4gdGhlIGdyYXBoOg0KDQpgYGB7ciB1c2VfZ2V0X2VkZ2VzfQ0KZ2V0X2VkZ2VzKGdyYXBoKQ0KYGBgDQoNCkxpa2Ugbm9kZXMsIGVkZ2VzIGFsc28gaGF2ZSBJRCB2YWx1ZXMuIFRoaXMgaXMgaW1wb3J0YW50IGZvciBkaXN0aW5ndWlzaGluZyBiZXR3ZWVuIGVkZ2VzIHdoZW4gYSBwYWlyIG9mIG5vZGVzIGhhcyBtdWx0aXBsZSBlZGdlcyBiZXR3ZWVuIHRoZW0gKGFuZCBlc3BlY2lhbGx5IGlmIHRoZXkgYXJlIGluIHRoZSBzYW1lIGRpcmVjdGlvbiBpbiBhIGRpcmVjdGVkIGdyYXBoKS4gVG8gZ2V0IGFsbCBlZGdlIElEIHZhbHVlcyBpbiB0aGUgZ3JhcGgsIHVzZSB0aGUgYGdldF9lZGdlX2lkcygpYCBmdW5jdGlvbi4NCg0KYGBge3IgdXNlX2dldF9lZGdlX2lkc30NCmdldF9lZGdlX2lkcyhncmFwaCkNCmBgYA0KDQpUaGUgYGVkZ2VfaW5mbygpYCwgbGlrZSB0aGUgYG5vZGVfaW5mbygpYCBmdW5jdGlvbiwgYWx3YXlzIHJldHVybnMgYSBkYXRhIGZyYW1lIHdpdGggYSBzZXQgbnVtYmVyIG9mIGNvbHVtbnMuIEluIHRoaXMgY2FzZSwgaXQgaXMgdGhlIGVkZ2UgSUQgdmFsdWUgYGlkYCwgdGhlIG5vZGUgSUQgdmFsdWVzIGBmcm9tYCBhbmQgYHRvYCB0aGF0IGRlZmluZSB0aGUgbGlua3MsIGFuZCB0aGUgcmVsYXRpb25zaGlwIChgcmVsYCkgbGFiZWxzIGZvciB0aGUgZWRnZXMuDQoNCmBgYHtyIHVzZV9lZGdlX2luZm99DQplZGdlX2luZm8oZ3JhcGgpDQpgYGANCg0KIyMgUGFydCAyLiBJbnNwZWN0aW5nIE5vZGVzLCBFZGdlcywgYW5kIHRoZWlyIEF0dHJpYnV0ZXMNCg0KVHdvIG9mIGEgZ3JhcGggb2JqZWN0J3MgbWFpbiBjb21wb25lbnRzIGFyZSBpdHMgbm9kZSBkYXRhIGZyYW1lIChuZGYpIGFuZCBpdHMgZWRnZSBkYXRhIGZyYW1lIChlZGYpLiBUaGVzZSBjYW4gYmUgb2J0YWluZWQgYXMgaW5kaXZpZHVhbCBkYXRhIGZyYW1lcyB1c2luZyB0aGUgYGdldF9ub2RlX2RmKClgIGFuZCBgZ2V0X2VkZ2VfZGYoKWAgZnVuY3Rpb25zOg0KDQpgYGB7ciB1c2VfZ2V0X25vZGVfZGZ9DQojIEdldCB0aGUgZ3JhcGgncyBuZGYgd2l0aCB0aGUgYGdldF9ub2RlX2RmKClgIGZ1bmN0aW9uDQpnZXRfbm9kZV9kZihncmFwaCkNCmBgYA0KDQpgYGB7ciB1c2VfZ2V0X2VkZ2VfZGZ9DQojIEdldCB0aGUgZ3JhcGgncyBlZGYgd2l0aCB0aGUgYGdldF9lZGdlX2RmKClgIGZ1bmN0aW9uDQpnZXRfZWRnZV9kZihncmFwaCkNCmBgYA0KDQpGb3IgdGhlIG5kZiwgdGhlIGBpZGAsIGB0eXBlYCwgYW5kIGBsYWJlbGAgY29sdW1ucyB3aWxsIGFsd2F5cyBiZSBwcmVzZW50IGFuZCBpbiB0aGF0IHByZXNjcmliZWQgb3JkZXIuIEZvciB0aGUgZWRmLCBpdCBpcyB0aGUgYGlkYCwgYGZyb21gLCBgdG9gLCBhbmQgYHJlbGAgY29sdW1ucyB3aWxsIGFsd2F5cyBiZSBwcmVzZW50LiBBbnkgYWRkaXRpb25hbCBjb2x1bW5zIGNhbiBiZSBlaXRoZXIgcGFyYW1ldGVycyByZWNvZ25pemVkIGJ5IHRoZSBncmFwaCByZW5kZXJpbmcgZW5naW5lIChlLmcuLCBgY29sb3JgLCBgZm9udG5hbWVgLCBldGMuKSBvciBub24tYWVzdGhldGljIHByb3BlcnRpZXMgb2YgdGhlIG5vZGVzIG9yIGVkZ2VzIChlLmcuLCBhIG5vZGUgYGRhdGFgIHZhbHVlIG9yIGFuIGVkZ2UgYHdlaWdodGApLg0KDQojIyBQYXJ0IDMuIERldGVybWluaW5nIEV4aXN0ZW5jZSBvZiBOb2RlcyBvciBFZGdlcw0KDQpUaGVyZSBtYXkgYmUgY2FzZXMgd2hlcmUgeW91IG5lZWQgdG8gdmVyaWZ5IHRoYXQgYSBjZXJ0YWluIG5vZGUgSUQgZXhpc3RzIGluIHRoZSBncmFwaCBvciB0aGF0IGFuIGVkZ2UgZGVmaW5pdGlvbiBpcyBwcmVzZW50LiBUaGUgYG5vZGVfcHJlc2VudCgpYCBhbmQgYGVkZ2VfcHJlc2VudCgpYCBmdW5jdGlvbnMgd2lsbCBwcm92aWRlIGEgYFRSVUVgIG9yIGBGQUxTRWAgdmFsdWUgYXMgY29uZmlybWF0aW9uLg0KDQpHZXQgdGhlIG5vZGUgSUQgdmFsdWVzIHByZXNlbnQgaW4gdGhlIGdyYXBoIHdpdGggdGhlIGBnZXRfbm9kZV9pZHMoKWAgZnVuY3Rpb24uDQoNCmBgYHtyIHVzZV9nZXRfbm9kZV9pZF8yfQ0KZ2V0X25vZGVfaWRzKGdyYXBoKQ0KYGBgDQoNCklzIG5vZGUgd2l0aCBJRCBgMWAgaW4gdGhlIGdyYXBoPyBVc2UgYG5vZGVfcHJlc2VudCgpYCB0byBmaW5kIG91dC4NCg0KYGBge3IgaXNfbm9kZV8xX3ByZXNlbnR9DQpub2RlX3ByZXNlbnQoZ3JhcGgsIDEpDQpgYGANCg0KSXMgbm9kZSB3aXRoIElEIGA1YCBpbiB0aGUgZ3JhcGg/DQoNCmBgYHtyIGlzX25vZGVfNV9wcmVzZW50fQ0Kbm9kZV9wcmVzZW50KGdyYXBoLCA1KQ0KYGBgDQoNCkdldCB0aGUgbm9kZSBJRCB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBlZGdlcyBwcmVzZW50IGluIHRoZSBncmFwaCAod2l0aCB0aGUgYGdldF9lZGdlcygpYCBmdW5jdGlvbikuDQoNCmBgYHtyIHVzZV9nZXRfZWRnZXNfMn0NCmdldF9lZGdlcyhncmFwaCkNCmBgYA0KDQpUbyBkZXRlcm1pbmUgd2hldGhlciBhbiBlZGdlIGlzIHByZXNlbnQsIHRoZSBgZWRnZV9wcmVzZW50KClgIGZ1bmN0aW9uIHRha2VzIDIgYXJndW1lbnRzIGFmdGVyIGBncmFwaGA6IGBmcm9tYCBhbmQgYHRvYC4gU28sIHRvIGZpbmQgb3V0IHdoZXRoZXIgdGhlIGVkZ2UgYDEtPjRgIGlzIHByZXNlbnQsIHRoZSBmb2xsb3dpbmcgY2FuIGJlIHVzZWQ6DQoNCmBgYHtyIGlzX2VkZ2VfMV80X3ByZXNlbnR9DQplZGdlX3ByZXNlbnQoZ3JhcGgsIDEsIDQpDQpgYGANCg0KU2luY2UgdGhlIHRoZSBlZGdlIGAyLT40YCBkb2VzIG5vdCBleGlzdCwgdGhlIGZvbGxvd2luZyB3aWxsIHJldHVybiBGQUxTRToNCg0KYGBge3IgaXNfZWRnZV8yXzRfcHJlc2VudH0NCmVkZ2VfcHJlc2VudChncmFwaCwgMiwgNCkNCmBgYA0KDQo=